home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
QRZ! Ham Radio 8
/
QRZ Ham Radio Callsign Database - Volume 8.iso
/
mac
/
files
/
t_sys5
/
unixcpio.gz
/
unixnet.cpio
/
brk.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-07-11
|
4KB
|
135 lines
/* This is a reverse-compilation of Borland's brk() and sbrk() functions.
** Borland would prefer that I distribute these things on an object-only
** basis, but since this is a bug fix that they knew about on version 1.0
** and DIDN'T fix on version 1.5, to heck with them.
**
** This is only needed in small data models, hence the leading #ifdef.
** The fix lets us define the so-called red zone, which is the buffer
** space between the bottom of the heap and the top of the stack. Also
** fixes a bug wherein brk() returned the new brklvl on success. Wrong!
**
** If you '#define original', you'll get Borland's original code.
*/
#if defined(__TINY__) || defined(__SMALL__) || defined(__MEDIUM__)
#pragma inline
extern int errno;
extern int __brklvl;
#ifdef original
#define _STKRED 0x100
#else
extern int _STKRED;
#endif
int __brk(unsigned bar)
{
_AX = bar;
asm mov dx,sp
_DX -= _STKRED;
if (_AX < _DX) {
__brklvl = _AX;
#ifndef original
return 0;
#endif
}
else {
errno = 8;
_AX = -1;
}
}
/*
Original from Turbo C's cm library:
BRK_TEXT:___brk:
3999:0001 55 PUSH BP
3999:0002 8BEC MOV BP,SP
3999:0004 8B4606 MOV AX,[BP+06]
3999:0007 8BD4 MOV DX,SP
3999:0009 81EA0001 SUB DX,0100
3999:000D 3BC2 CMP AX,DX
3999:000F 7305 JNB ___brk+15 (0016)
3999:0011 A38E00 MOV [008E],AX
3999:0014 EB09 JMP ___brk+1E (001F)
3999:0016 C70688000800 MOV Word Ptr [0088],0008
3999:001C B8FFFF MOV AX,FFFF
3999:001F 5D POP BP
3999:0020 CB RETF
*/
__sbrk(unsigned long bar)
{
asm mov ax,[bp+06]
asm mov dx,[bp+08]
asm add ax,__brklvl
asm adc dx,0
asm mov cx,ax
_CX += _STKRED;
asm adc dx,0
if (_DX == 0 && _CX < _SP) asm xchg ax,__brklvl;
else {
errno = 8;
_AX = -1;
}
}
/*
Original from Turbo C's cm library:
BRK_TEXT:___sbrk:
3999:0021 55 PUSH BP
3999:0022 8BEC MOV BP,SP
3999:0024 8B4606 MOV AX,[BP+06]
3999:0027 8B5608 MOV DX,[BP+08]
3999:002A 03068E00 ADD AX,[008E]
3999:002E 83D200 ADC DX,+00
3999:0031 8BC8 MOV CX,AX
3999:0033 81C10001 ADD CX,0100
3999:0037 83D200 ADC DX,+00
3999:003A 0BD2 OR DX,DX
3999:003C 750A JNZ ___sbrk+27 (0048)
3999:003E 3BCC CMP CX,SP
3999:0040 7306 JNB ___sbrk+27 (0048)
3999:0042 87068E00 XCHG AX,[008E]
3999:0046 EB09 JMP ___sbrk+30 (0051)
3999:0048 C70688000800 MOV Word Ptr [0088],0008
3999:004E B8FFFF MOV AX,FFFF
3999:0051 5D POP BP
3999:0052 CB RETF
*/
int brk(unsigned bar) {return __brk(bar);}
/*
Original from Turbo C's cm library:
BRK_TEXT:_brk:
3999:0053 55 PUSH BP
3999:0054 8BEC MOV BP,SP
3999:0056 FF7606 PUSH [BP+06]
3999:0059 0E PUSH CS
3999:005A E8A4FF CALL ___brk
3999:005D 59 POP CX
3999:005E 5D POP BP
3999:005F CB RETF
*/
sbrk(int bar) {return __sbrk(bar);}
/*
Original from Turbo C's cm library:
BRK_TEXT:_sbrk:
3999:0060 55 PUSH BP
3999:0061 8BEC MOV BP,SP
3999:0063 8B4606 MOV AX,[BP+06]
3999:0066 99 CWD
3999:0067 52 PUSH DX
3999:0068 50 PUSH AX
3999:0069 0E PUSH CS
3999:006A E8B4FF CALL ___sbrk
3999:006D 8BE5 MOV SP,BP
3999:006F 5D POP BP
3999:0070 CB RETF
*/
#endif